let aa: string = "你好呀"
console.log(aa);

const name:string = 'jk';
const age:number = 30;
const gender:boolean = true

// 基础类型， 包装类型 规范 小写类型string一般用于描述基本类型，大写的用来描述实例类型
let s1:string = 'abc';
// let s2:string = new String('abc') //会报错
let s3:String = '1'
let s4:String = new String('1') // 大写的用来描述实例类型

// 使用基本类型时，小写类型来标识

// 数组的概念: 用于存储多个类型相同的集合, 不关心位置
let arr1:number[] = [1,2,3,4,5]
let arr2:Array<number> = [1,2,3,4,5]
let arr3: (number | string)[] = [1,2,3,'a','b']

// 元组 tuple---对位置有要求--不能增加规定类型之外的类型数据，只能是已有的，而且增加后不能访问
let tuple:[string,number,string,number] = ['1',1,'2',2]
// tuple.push(true)
const item = tuple[3]

// 枚举: 自带类型的对象--约定一组格式我们会用枚举， 状态码、权限、数据格式、标志位
enum STATUS {
    'OK' = 'ok',
    'NO_ok' = 100,
    'NOT_FOUND'
}

// null undefined 正常情况下只能赋予给null和undefined
const u: undefined = undefined
const n: null = null



// void(空,失效) 类型代表的是空类型  undefined
//  undefined可以赋予给void 都代表空,null 不行
function a():void{
    return undefined
}

// function b():void{
//     return null
// }

// never永远不
// 函数无法执行完毕
function whileTrue():never{
    while(true){};
}

function throwError():never{
    throw Error()
}

// any 任何类型 能不写any 就不要写any,它会导致类型丧失检测

// object 引用类型
function create(val:object){  // object 和 Object的区别
    // 如果标注的是非原始数据类型(boolean,number,string) 就用小写的object
}
create({})
create(function(){})
create([])

// 布尔值
let isDone: boolean = false

// 数字
let decLiteral: number = 6
let decLiteral2: number = 0xf00d

// 字符串
let name2: string = `Gene`

// 数组
let list: number[] = [1,2,3] // 方式1
let list2: Array<number> = [1,2,3]
// Array<number> : number[]

// 元组 Tuple表示一个已经知道元素数量和类型的数组,类型不必相同
let x:[string,number];
x = ["hello",10]
console.log(x[0].replace('e','_'));


// void --和any相反 
function abc(): void {
    console.log('this is my warning');
}

let unusable: void = undefined



export default {} // 独立模块不影响其他人